package model.scaling;

import java.util.ArrayList;
import java.util.List;

import model.auxillary.Parameter;
import model.auxillary.ParameterCollectionScaling;
import model.auxillary.ParameterListScaling;
import model.auxillary.ParameterListScaling.ParameterType;

//#Neu
/**
* Interface for the {@code Product} class.
* @author Sebastian Perlwitz
*
*/
public interface IProduct extends ICalculatableScaling {
	
	/**
 	 * To add a {@code Factory} to this {@code Product}.
 	 * @param factory the factory to be added.
 	 */
 	public void addFactory(IFactory factory);
 	
 	/**
 	 * To remove all assigned factories from this {@code Product}.
 	 */
 	public void removeAllFactoriesOfProduct();
 	
 	/**
 	 * To get all factories that have been assigned to this {@code Product}.
 	 * @return The factories.
 	 */
 	public ArrayList<IFactory> getFactories();
	
 	/**
     * To set an identifying name for this {@code Product}.
     * @param name the new name that is to be set.
     */
    public void setName(String name);
    
    /**
	 * To get the name of this {@code Product}.
	 * @return The name of this {@code Product}.
	 */
	public String getName();
 	
 	/**
	 * To get the unique ID of this {@code Product}.
	 * @return The unique ID.
	 */
    public String getID();
    
    /**
	 * To get all parameters of this {@code Product}.
	 * @return The parameters.
	 */
	public ParameterListScaling getParameters();
 	
 	/**
	 * To get a parameter by it's unique ID.	 
	 * @param parameterID the parameter's ID.
	 * @return The parameter.
	 */
	public Parameter getParameter(String parameterID);
 	
 	/**
	 * To get a parameter by its abbreviation and type.
	 * @param abbreviation the abbreviation of the parameter.
	 * @param type the type of the parameter.
	 * @return The parameter.
	 */
	public Parameter getParameter(String abbreviation, ParameterType type);
	
	/**
     * To get all parameters of same type.
     * @param type the parameters' type.
     * @return The parameters.
     */
    public List<ParameterCollectionScaling> getParameters(ParameterType type);

}
